/**
 *
    算法描述：模拟解法。将除了左上角的部分进行赋值1操作，不停递归，直到最后只有一个元素。
            关键在于，递归时候的正方形的范围（上下左右边界）。
    解决所需数据结构+算法：
**/
#include<iostream>
#include<cstring>
using namespace std;

bool a[1050][1050];

void make(int x1, int y1, int x2, int y2) {
    if(x1==x2 && y1==y2) { // 跳出条件
        a[x1][y1] = 1;
        return ;
    }
    // 切分成4部分，左上部分不予处理
    make(x2/2+x1/2+1, y1, x2, y2/2+y1/2); // 左下
    make(x1, y2/2+y1/2+1, x2/2+x1/2, y2); // 右上
    make(x2/2+x1/2+1, y2/2+y1/2+1, x2, y2); // 右下
}

int main() {
    memset(a, 0, sizeof(a));
    int n;
    cin >> n;

    make(1, 1, 1<<n, 1<<n); // 核心函数

    for(int i=1; i<=(1<<n); i++) { // 遍历输出
        for(int j=1; j<=(1<<n); j++) {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}